【微服务框架】flask
简介
参考:
实现
# 实现一个小例子
from flask import Flask
# 创建flask实例,其中__name__为应用的名称,如果是应用程序包,则需要写程序包的名称
app = Flask(__name__)
# 使用route装饰器实现不同的url解析,从而确定什么样的url可访问函数,实质就是网页显示的后缀名
@app.route('/')
def hello_world():
return 'Hello World!'
# 条件语句即若直接运行脚本,则执行下面的语句,若是以包的形式被调用,则以下语句不会执行
if __name__ == '__main__':
# 运行flask web应用程序
app.run()
执行方式运行这个服务器时,目前只能从自己的计算机上访问。如果服务器公开使用,则可通过app.run(host='0.0.0.0')让操作系统监听所有公网ip
问题
在每次修改代码后需要手动重启服务。
可以通过启动调试支持,在服务器重启后自动载入修改后的code,并且在发生错误的时候提供一个有效的调试器
# 配置应用对象
app.debug = True
app.run()
# 执行参数传入
app.run(debug=True)
问题
允许执行任意code,存在安全隐患,不能直接用在生产环境
进阶
可以通过规则定义url,目的是采用清晰的url操作相应的函数功能
# 通过后缀名区分功能
@app.route('/user/<username>')
def show_user(username):
return 'User: {}'.format(username)
接口服务
参考:
- https://www.jianshu.com/p/0c3bd0230564
- https://blog.csdn.net/strawbingo/article/details/46458959
- https://juejin.im/entry/5b39e63ae51d455cd054cddd
- https://www.crifan.com/server_start_up_listen_ip_choice_127_0_0_1_vs_0_0_0_0/
实现
import models
from models import Customer
from flask import Flask, request, session, redirect, url_for, render_template, flash,json,jsonify
import os
app = Flask(__name__)
@app.route('/',methods = ['GET','POST'])
def enter_ID():
if request.method == 'POST':
Galactic_ID = request.form['Galactic_ID']
if Customer(Galactic_ID).find():
return redirect(url_for('relationships',ID=request.form.get('Galactic_ID')))
else:
return "Wrong Galactic_ID"
else:
return render_template('Gal.html')
@app.route('/Customer_relationships',defaults={'ID':'Galactic_ID'},methods=['GET','POST'])
@app.route('/Customer_relationships/<ID>',methods=['GET','POST'])
def relationships(ID):
data = Customer(ID).get_relationships()
return render_template('rel.html',data= json.dumps(data))
if __name__ == '__main__':
host = os.getenv('IP','0.0.0.0')
port = int(os.getenv('PORT',5000))
app.secret_key = os.urandom(24)
app.run(host=host,port=port)
import requests,json
req = '{"cust":123, "seeds_path":"liuyan22/lookalike/seeds/tmp_liuyan22_system_lookalike_seed_novel", "extend": 5}'
url = 'http://127.0.0.1:5000/'
r = requests.post(url,data=json.dumps(req))
print(r.json())
curl -H "Content-Type:application/json; charset=UTF-8;Data_Type:msg" -X POST --data '{"cust":123, "seeds_path":"liuyan22/lookalike/seeds/tmp_liuyan22_system_lookalike_seed_novel", "extend": 5}' 'http://10.41.20.196:5000/seeds_extend/'
报错
- "POST / HTTP/1.1" 404 原因:请求地址不存在 解决:在代码中存在路径后缀,在发送请求的时候访问的url没有加后缀
- socket.gaierror: [Errno -2] Name or service not known 原因:app.run()时host配置为0.0.0.0
- socket.gaierror: [Errno 8] nodename nor servname provided, or not known
- PermissionError: [Errno 13] Permission denied
- "POST /seeds_extend HTTP/1.1" 500 原因:函数有问题[外部参数的传参;发送请求时,url必须以/结尾] 解决:检查代码逻辑